"""
Algoritmo del script

# 1 itera los archivos a trabajar
#   2 carga la información a memoria
#   4 elimminar los que no tienen peptidos unicos
#   5 buscar subsets con las familias u ordenes indicados
#   6 buscar subsets con todos los demas

"""

"""
Librerias a utilizar
"""
import pandas as pd  # Libreria para cargar y manipular los datos || Esta libreria debe ser instalada con el comando pip install pandas
import os  # Libreria utilizada para trabajar los archivos creados por el script anterior

"""
Configuración del script
"""
# fmt: off
# Configuracion de familias / ordenes a buscar antes de realizar el ciclo
primeraBusqueda = ["Bos taurus",  "Mus musculus", "Rattus norvegicus", "Cairina moschata", "Gallus gallus", "Canis lupus", "Homo sapiens" ]

eliminarSubsets = True
porcentajeEliminacion = 50  # Porcentaje mínimo de similitud para eliminar
eliminaPeptidosSinCoincidencias = True # Elimna los peptidos que coinciden con una sola familia
eliminarSubSetsConPrioridad = True # Compares and deletes subsets starting from the list above
actualizarTotales = True # Actualiza los totales despues de eliminar peptidos que coinciden con una sola familia
agregarNuevosTotales = True # Agrega una nueva fila con totales actualizados
eliminarSinUnicos = True # Elimina las familias que tienen uno o ningun peptido único
imprimirEXCEL = False # True imprime datos en formato EXCEL | False imprime datos en formato CSV


# fmt: on
"""
Preparación de los datos y las variables a utilizar
"""
rutaCarpeta = "/Users/losteven/Desktop/AN_scripts_LC-MSMS/20210206_results"  # Ruta donde se encuentran los archivos a trabajar # Se utiliza doble diagonal invertida por temas de programación

# For each file in the folder or directory
for filename in os.listdir(rutaCarpeta):
    # Use file if matches the condition
    if filename.startswith("Output ") and filename.endswith(".csv"):

        print("> Inicio del archivo " + filename)

        # Loads the csv to memory
        data = pd.read_csv(
            os.path.join(rutaCarpeta, filename), delimiter=",", index_col="Sequence"
        )

        columnas = (
            data.columns.to_list()
        )  # Obtengo un listado de columnas para eliminar subsets
        columnas.pop(0)  # Removes "Total_Coincidencias" from the list of columns
        peptidos = data.index.to_list()[:-2]

        if eliminarSubSetsConPrioridad:

            for elemento in primeraBusqueda:

                columnas = (
                    data.columns.to_list()
                )  # Obtengo un listado de columnas para eliminar subsets
                columnas.pop(
                    0
                )  # Removes "Total_Coincidencias" from the list of columns

                if elemento not in columnas:
                    print("\t" + elemento + " no se encuentra en el archivo.")
                    continue

                columnasPorEliminar = []  # Listado de nombres de columnas a eliminar

                columnaBase = data[elemento].copy()

                print("\t" + elemento)

                for columna in columnas:

                    #print("\t\t" + columna)

                    if columna == elemento:
                        #print("\t\t\t Misma columna")
                        continue  # Skips iteration

                    valoresIguales = 0  # Variable to count iqual values

                    for peptido in peptidos:
                        if (
                            columnaBase.at[peptido] == 1
                            and data.at[peptido, columna] == 1
                        ):
                            #print("\t\t\t Mismo valor en el peptido: " + peptido)
                            valoresIguales += 1

                    if porcentajeEliminacion <= (
                        valoresIguales * 100 / data.at["Total", columna]
                    ):
                        columnasPorEliminar.append(columna)

                data = data.drop(columns=list(dict.fromkeys(columnasPorEliminar)))

        if eliminarSubsets:

            columnas = (
                data.columns.to_list()
            )  # Obtengo un listado de columnas para eliminar subsets
            columnas.pop(0)  # Removes "Total_Coincidencias" from the list of columns

            columnasPorEliminar = []  # Listado de nombres de columnas a eliminar

            nombreColumnaBase = data.columns[1]
            #print("\t" + nombreColumnaBase)
            columnaBase = data.iloc[:, 1].copy()

            for columna in columnas:

                #print("\t\t" + columna)

                if columna == nombreColumnaBase:
                    #print("\t\t\tMisma columna")
                    continue  # Skips iteration

                valoresIguales = 0  # Variable to count iqual values

                for peptido in peptidos:
                    if columnaBase.at[peptido] == 1 and data.at[peptido, columna] == 1:
                        #print("\t\t\t Mismo valor en el peptido: " + peptido)
                        valoresIguales += 1

                    if columnaBase.at[peptido] == 0 and data.at[peptido, columna] == 1:
                        #print("\t\t\tAgrego valor a columna base")
                        columnaBase.at[peptido] = 1

                #print(valoresIguales)
                #print(data.at["Total", columna])
                #print(valoresIguales * 100 / data.at["Total", columna])
                if porcentajeEliminacion <= (
                    valoresIguales * 100 / data.at["Total", columna]
                ):
                    columnasPorEliminar.append(columna)

            data = data.drop(columns=list(dict.fromkeys(columnasPorEliminar)))

        # Imprime el archivo data.csv
        data.to_csv(filename.split("Output ")[1], index=True, header=True)

        print("< Fin del archivo " + filename + "\n")

        continue
